package pl.edu.pw.mini.java2.Communicator.Server;

import java.io.*;
import java.util.concurrent.*;

/**
 * Klasa odpowiadjąca za wysyłanie wiadmości do obsługiwanego klienta.
 * @author Dymitr Załunin, Kamil Łysik
 */
public class WriterWorker extends Thread {
	private ClientHandler client;
	private DataOutputStream output;
	private BlockingQueue<Message> buffer = new LinkedBlockingDeque<Message>();

	/**
	 * Kontruktor tworzacy nową instancję klasy. 
	 * @param client Obsługiwany klient. 
	 * @param output Strumień wyjściowy.
	 */
	public WriterWorker(ClientHandler client, DataOutputStream output) {
		this.client = client;
		this.output = output;
	}

	@Override
	public void run() {
		// Main loop for reading messages from queue
		// Send message if readed
		try {
			while (true) {
				Message m = buffer.take();
				ServerLogger.print("Writer for "+client.getName() + " sends message type: "
						+ m.getType());
				m.send(output);
			}
		} catch (Exception e) {
			ServerLogger.print("Writer for " + client.getName() + " got exception: "
					+ e.toString());
		}
		ServerLogger.print("Writer for " + client.getName() + " finished job.");
	}

	/**
	 * Metoda dodająca wiadomośc do kolejki wiadomości do wysłania.
	 * @param m Wiadomość do wysłania.
	 */
	public void sendMessage(Message m) {
		try {
			buffer.put(m);
		} catch (InterruptedException ex) {
		}
	}

	/**
	 * Przerwanie wątku wysyłającego wiadomości do obsługiwanego klienta.
	 */
	public void close() {
		try {
			output.close();
			this.interrupt();

		} catch (IOException ignored) {
		}
	}
}
